{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Using a numerical integration within fsolve\n",
"## In this example, we find the chemical potential of a collection of non-interacting identical Bosons.\n",
"*May 5, 2021*\n",
"\n",
"- First import some required modules"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.integrate import quad\n",
"from scipy.optimize import fsolve\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The left-hand side of the equation that we will solve is:\n",
"\n",
"$2\\pi^2 n\\left(\\dfrac{\\hbar^2}{2mk_\\mathrm{B}T}\\right)^{3/2}$\n",
"\n",
"where\n",
"> $n$ is the particle number density \n",
"$m$ is the mass of the particles \n",
"$T$ is temperature\n",
"\n",
"- We will enter the appropriate values of $^4$He and use a temperature of 4 K."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7937834051194786"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n = 2.2e28 # 1/m^3\n",
"m = 6.68e-27 # kg\n",
"hbar = 1.05e-34 # Js\n",
"kB = 1.38e-23 # J/K\n",
"T = 4 # K\n",
"LHS = 2*np.pi**2*n*(hbar**2/(2*m*kB*T))**(3/2)\n",
"LHS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On the right-hand side of the equation that we want to solve is the integral:\n",
"\n",
"$\\int_0^\\infty \\dfrac{x^2}{e^{x^2-\\eta}-1}\\, dx$\n",
"\n",
"where $\\eta=\\mu/k_\\mathrm{B}T$ and $\\mu$ is the chemical potential.\n",
"\n",
"\n",
"- First, define a function that represents the integrand of the integral."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def integrand(x, eta):\n",
" return x**2/(np.exp(x**2 - eta) - 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Next, define a second fucntion that calls the first function, integrates it numerically using *quad()* and then returns LHS - RHS where the RHS is the integral. Ultimately, we want to find the value of $\\eta$ that makes this difference zero."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def func(eta):\n",
" y, err = quad(integrand, 0, np.inf, args=(eta,))\n",
" return LHS - y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Now, use *fsolve()* to find the solution for $\\eta$ when $T=4$~K. The second option in *fsolve()* is an initial guess for the value of the solution. We can then use the $\\eta$ solution to calculate $\\mu/k_\\mathrm{B} = \\eta T$."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The value of eta is -0.06714819569069219 when the temperature is 4 K.\n",
"The value of mu/kB is -0.26859278276276877 K when the temperature is 4 K.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
":2: RuntimeWarning: overflow encountered in exp\n",
" return x**2/(np.exp(x**2 - eta) - 1)\n"
]
}
],
"source": [
"sol = fsolve(func, -0.07)\n",
"print('The value of eta is', sol[0], 'when the temperature is', T,'K.')\n",
"print('The value of mu/kB is', sol[0]*T, 'K when the temperature is', T,'K.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can put the *fsolve()* statement inside a for loop so that $\\eta$ and $\\mu/k_\\mathrm{B}$ can be found at many different temperatures.\n",
"\n",
"- First, delete the value assigned to $T$ and define another function for the LHS of the equation that we want to solve."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7937834051194786"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"del T\n",
"def LHS(T):\n",
" return 2*np.pi**2*n*(hbar**2/(2*m*kB*T))**(3/2)\n",
"LHS(4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- We also need to update the function \"func(eta)\" so that \"LHS\" $\\to$ \"LHS(T)\" is given as a function of T."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def func(eta):\n",
" y, err = quad(integrand, 0, np.inf, args=(eta,))\n",
" return LHS(T) - y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We need to provide *fsolve()* with initial guesses for each iteration of the loop. The strategy will be to use the $\\eta$ solution from the previous iteration as the guess for the current iteration. We then only need to have a reasonable first guess for the first iteration.\n",
"\n",
"We will start the loop at the highest temperature when the chemical potential should have a value that is close to the classical result for an ideal gas. In this case, $\\eta=\\mu/k_\\mathrm{B}T$ is expected to be close to $\\ln\\left(n/n_\\mathrm{Q}\\right)$, where:\n",
"\n",
"$n_\\mathrm{Q}=\\left(\\dfrac{mk_\\mathrm{B}T}{2\\pi\\hbar^2}\\right)^{3/2}$\n",
"\n",
"- Create some empty lists and then execute the for loop."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
":2: RuntimeWarning: overflow encountered in exp\n",
" return x**2/(np.exp(x**2 - eta) - 1)\n"
]
}
],
"source": [
"TList = []\n",
"etaList = []\n",
"muList = []\n",
"T0 = 100\n",
"nQ = (m*kB*T0/(2*np.pi*hbar**2))**(3/2)\n",
"guess = np.log(n/nQ)\n",
"for T in np.arange(100, 4, -0.1):\n",
" TList += [T]\n",
" sol = fsolve(func, guess)[0]\n",
" etaList += [sol]\n",
" muList += [sol*T]\n",
" guess = sol # Update the guess value before starting the next iteration"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Here's a plot of $\\eta$ as a function of temperature with the temperature axis on a log-scale."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"